
t3 = require't3'

--::::;;;;;;::::;;;:::;;;;::::;;;;::::;;;;::::;;;;::::;;;;:::::;;;;::::;;;;::::;;;;

local map_files = {}
local subscriptions = {}

-- cadastra um arquivo no servidor
function add_file (pid, filename)
  print("add_file",pid,filename)
  map_files[filename]=pid
  if subscriptions[filename] then
    for i,v in ipairs(subscriptions[filename]) do
      t3.send(v,'subscription_reply("'..filename..'","'..pid..'")')
    end
    subscriptions[filename] = nil
  end
end

-- remove do servidor a entrada de um arquivo 
function remove_file (pid, filename)
  if map_files[filename]==pid then
    print("remove_file",pid,filename)
    map_files[filename]=nil
  end
end

-- envia a lista de arquivos cadastrados no servidor
function send_file_list (pid)
  local tab = {}
  for k,v in pairs(map_files) do
    table.insert(tab,k)
  end
  local ser_tab = t3.serialize('local tab',tab)
  t3.send(pid,ser_tab .. ' receive_file_list(tab)')
end

-- processo pid se cadastra para ser notificado da
-- chegada de um determinado arquivo
function subscribe (pid, filename)
  print("subscribe",pid,filename)
  if map_files[filename] then
    return t3.send(pid,'subscription_reply("'..filename..'","'..map_files[filename]..'")')
  end
  if not subscriptions[filename] then
    subscriptions[filename] = {}
  end
  table.insert(subscriptions[filename],pid)
end

t3.loop()

